Цикл for...in — перебор ключей объекта

Цикл for...in перебирает ключевые свойства объекта — то есть имена (ключи) его перечисляемых свойств.

Синтаксис

for (ключ in объект) {
  // тело цикла
}

Пример: перебор свойств объекта

const user = {
  name: "Анна",
  age: 28,
  role: "администратор"
};

for (let key in user) {
  console.log(key + ": " + user[key]);
}

Вывод:

name: Анна
age: 28
role: администратор

Каждая итерация возвращает имя свойства — строку. Чтобы получить значение, нужно обратиться через объект[ключ].

Особенности

  • Перебирает только перечисляемые свойства (те, что можно увидеть в Object.keys()).
  • Включает свойства, унаследованные от прототипа, если они не помечены как enumerable: false.
  • Порядок не гарантирован — особенно для числовых ключей, которые могут быть отсортированы по возрастанию.

Почему не подходит для массивов?

const arr = ["a", "b", "c"];
arr.extra = "лишнее"; // добавили нечисловое свойство

for (let key in arr) {
  console.log(key); // выведет: "0", "1", "2", "extra"
}

Проблемы:

  1. Не только индексы — for...in перебирает все перечисляемые свойства, включая те, что добавлены вручную.
  2. Порядок может нарушиться — в некоторых движках числовые ключи сортируются по возрастанию, даже если они были добавлены в другом порядке.
  3. Нет гарантии, что вы получите только элементы массива — если библиотека расширила Array.prototype, это тоже попадёт в цикл.

Правило

Не используйте for...in для массивов.
Используйте for...of или классический for.

Для массивов for...in — источник багов. Для объектов — нормально, если вы знаете, что делаете.